package com.dev.springBootDemo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

/**
 * ComparatorDemo 使用自定义比较器对字符串列表进行排序。
 */
public class ComparatorDemo {
    /**
     * 主函数执行字符串列表的排序操作。
     * @param args 命令行参数，未使用。
     */
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("cccc");
        list.add("aa");
        list.add("b");
        list.add("ddd");
        
        System.out.println("排序前" + list);
        // 使用自定义比较器对列表进行排序。
        Collections.sort(list, getComparator());
        System.out.println("排序后" + list);
    }
    
    /**
     * 使用Lambda表达式创建并返回Comparator实例
     * 获取一个比较器实例，该比较器按字符串长度进行排序。
     *
     *  Lambda表达式: (s1, s2) -> s1.length() - s2.length()
     *  这个表达式定义了一个比较规则，根据字符串的长度进行比较
     *  当s1.length() > s2.length()，返回正值，表示s1在排序中应该位于s2之后,s1比s2长
     *  当s1.length() < s2.length()，返回负值，表示s1在排序中应该位于s2之前,s1比s2短
     *  当s1.length() == s2.length()，返回0，表示两个字符串长度相等，保持原顺序,s1与s2一样长
     *
     *  方法的返回值是一个函数式接口,把一个Lambda表达式作为返回结果
     * @return 返回一个 Comparator 实例，用于按照字符串长度进行排序。
     */
    private static Comparator<String> getComparator() {
        // 使用 Lambda 表达式定义比较逻辑：按字符串长度进行比较。
        // 使用匿名内部类实现
//        return new Comparator<String>() {
//            @Override
//            public int compare(String s1, String s2) {
//                return s1.length()-s2.length();
//            }
//        };
        
        // Lambda 表达式写法，等效于上述匿名内部类实现。
        return (s1, s2) -> s1.length() - s2.length();
    }

    // 排序前[cccc, aa, b, ddd]
    // 排序后[b, aa, ddd, cccc]
}
